﻿
using System.Collections.Generic;

namespace MIAPWEB.Forms
{
    using System;
    using System.Linq;
    using System.Web.UI.WebControls;
    using MIAP.Entidades;
    using MIAP.Entidades.Enums;
    using MIAP.Negocio;
    using MIAPWEB.Common;

    /// <summary>
    /// Clase de la vista Administración de UsuariosPerfiles.
    /// </summary>
    public partial class AdministraPerfilesUsuario : PageBase
    {
        #region Campos

        /// <summary>
        /// Almacena el id del estatus del usuario.
        /// </summary>
        int idEstatus = 0;

        /// <summary>
        /// Almacena la información de los filtros para la búsqueda.
        /// </summary>
        UsuarioInfo filtroUsuario;

        /// <summary>
        /// Clase de negocio de las operaciones de usuario.
        /// </summary>
        private AdministrarUsuariosNegocio usuarioNegocio;

        /// <summary>
        /// Clase de negocio de las operaciones de usuarioPerfiles.
        /// </summary>
        private AdministrarUsuarioPerfilesNegocio usuarioPerfilNegocio;

        /// <summary>
        /// Clase de negocio de las operaciones de proyecto.
        /// </summary>
        private AdministrarProyectosNegocio proyectoNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones comunes del sistema.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        /// <summary>
        /// Clase de negocio para las operaciondes de configuración.
        /// </summary>
        private ConfiguracionNegocio configuracionNegocio;

        #endregion

        #region Propiedades

        /// <summary>
        ///  Obtiene o establece el Id del usuario.
        /// </summary>
        private int IdUsuario
        {
            get
            {
                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdUsuario]);
            }

            set
            {
                this.ViewState[AppQueryStrings.IdUsuario] = value;
            }
        }

        /// <summary>
        ///  Obtiene o establece el Id del perfil del usuario.
        /// </summary>
        private int IdPerfil
        {
            get
            {
                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdPerfil]);
            }

            set
            {
                this.ViewState[AppQueryStrings.IdPerfil] = value;
            }
        }

        /// <summary>
        /// registros busqueda perfiles
        /// </summary>
        private List<PerfilInfo> DataSourcePerfil
        {
            get
            {
                return this.ViewState["DataSourcePerfil"] as List<PerfilInfo>;
            }

            set
            {
                this.ViewState["DataSourcePerfil"] = value;
            }
        }

        /// <summary>
        /// registros busqueda usuarios
        /// </summary>
        private List<UsuarioInfo> DataSourceUsuario
        {
            get
            {
                return this.ViewState["DataSourceUsuario"] as List<UsuarioInfo>;
            }

            set
            {
                this.ViewState["DataSourceUsuario"] = value;
            }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="AdministraUsuario"/>
        /// </summary>
        public AdministraPerfilesUsuario()
        {
            this.usuarioNegocio = new AdministrarUsuariosNegocio();
            this.usuarioPerfilNegocio = new AdministrarUsuarioPerfilesNegocio();
            this.proyectoNegocio = new AdministrarProyectosNegocio();
            this.comunesNegocio = new ComunesNegocio();
            this.configuracionNegocio = new ConfiguracionNegocio();

            this.filtroUsuario = new UsuarioInfo();
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            var pageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
            this.grdUsuarios.PageSize = pageSize;
            this.grdPerfiles.PageSize = pageSize;

            if (!this.IsPostBack)
            {
                this.GetProyectos();
                this.GetEstatusUsuario();
                this.GetUsuarios();

                var permiso = AppSessionManager.Instance.Permisos.Where(p => p.Url == AppUrls.AltaPerfilesUsuario).SingleOrDefault();

                if (permiso == null)
                {
                    this.btnNuevo.Enabled = false;
                }
            }
        }

        /// <summary>
        /// Método que se ejecuta al seleccionar un registro del grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdUsuarios_SelectedIndexChanged(object sender, EventArgs e)
        {
            var dataKey = grdUsuarios.DataKeys[((GridView)sender).SelectedIndex];

            this.IdUsuario = int.Parse(dataKey.Value.ToString());

            if (this.IdUsuario > 0)
            {
                this.GetPerfilesByUsuario(false);
            }            
        }

        /// <summary>
        /// Evento que ocurre al seleccionar una página.
        /// </summary>
        /// <param name="sender">Objeto que inicio el evento</param>
        /// <param name="e">Parámetros de ejecución</param>
        protected void grdUsuarios_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdUsuarios.PageIndex = e.NewPageIndex;
            this.grdUsuarios.DataSource = this.DataSourceUsuario;
            this.grdUsuarios.DataBind();
        }
       
        /// <summary>
        /// Método ejecutado al seleccionar un registro del grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdPerfiles_SelectedIndexChanged(object sender, EventArgs e)
        {
            var dataKey = this.grdPerfiles.DataKeys[((GridView)sender).SelectedIndex];
            
            this.IdPerfil = int.Parse(dataKey.Value.ToString());           
        }

        /// <summary>
        /// Evento que ocurre al seleccionar una página.
        /// </summary>
        /// <param name="sender">Objeto que inicio el evento</param>
        /// <param name="e">Parámetros de ejecución</param>
        protected void grdPerfiles_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdPerfiles.PageIndex = e.NewPageIndex;
            this.grdPerfiles.DataSource = this.DataSourcePerfil;
            this.grdPerfiles.DataBind();
        }

        /// <summary>
        /// Método ejecutado al dar click al botón buscar. Obtiene los usuarios depediendo de los filtros.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Search();
            this.CleanSelection();
        }

        /// <summary>
        /// Método ejecutado al dar click al botón nuevo. Redirecciona a la vista AltaUsuarios.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(AppUrls.AltaPerfilesUsuario);
        }

        /// <summary>
        /// Método ejecutado al dar clickal botón modificar. Redirecciona a la vista Alta usuarios en el modo modificación.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnModificar_Click(object sender, EventArgs e)
        {
            if (this.IdPerfil == default(int))
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
            }
            else
            {
                this.Response.Redirect(string.Format("{0}?{1}={2}&{3}={4}", AppUrls.AltaPerfilesUsuario, AppQueryStrings.IdUsuario, this.IdUsuario, AppQueryStrings.IdPerfil, this.IdPerfil));
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón eliminar. Elimina el perfil seleccionado.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            if (this.IdPerfil == default(int))
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
            }
            else
            {
                this.usuarioPerfilNegocio.RemovePerfilesByUsuario(this.IdUsuario, this.IdPerfil);

                this.ShowMessage(this.GetGlobalResourceObject("Strings", "AdministrarPerfilesUsuario_PerfilRemovido").ToString());

                this.GetPerfilesByUsuario(false);

                this.CleanSelection();
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón salir. Redirecciona a la página de inicio.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(Common.AppUrls.Default);
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Obtiene los filtros.
        /// </summary>
        private void GetFilters()
        {
            this.idEstatus = int.Parse(this.ddlEstatus.SelectedValue);

            this.filtroUsuario.IdProyecto = this.ddlProyecto.SelectedValue==this.comunesNegocio.ValorTodos ? this.filtroUsuario.IdProyecto = null : int.Parse(this.ddlProyecto.SelectedValue);
            this.filtroUsuario.NombreUsuario = this.txtNombre.Text;
            this.filtroUsuario.ApellidoPaterno = this.txtApellidoPaterno.Text;
            this.filtroUsuario.ApellidoMaterno = this.txtApellidoMaterno.Text;
            this.filtroUsuario.AliasUsuario = this.txtUsuarioAD.Text;
            this.filtroUsuario.EstaActivo = (this.ddlEstatus.SelectedValue == this.comunesNegocio.ValorTodos)
                                                ? (bool?) null
                                                : (idEstatus == (int) Estatus.Activo);                
        }

        /// <summary>
        /// Obtiene los estatus del usuario.
        /// </summary>
        private void GetEstatusUsuario()
        {
            this.ddlEstatus.DataSource = this.comunesNegocio.GetEstatus();
            this.ddlEstatus.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlEstatus);
        }

        /// <summary>
        /// Obtiene todos los usuarios.
        /// </summary>
        private void GetUsuarios()
        {
            this.DataSourceUsuario = usuarioNegocio.GetSingleUsuarios(new UsuarioInfo());

            this.grdUsuarios.DataSource = this.DataSourceUsuario;
            this.grdUsuarios.DataBind();

        }

        /// <summary>
        /// Obtiene todos los usuarios dependiendo de los filtros.
        /// </summary>
        private void GetUsuariosByFilters()
        {
            this.DataSourceUsuario = this.usuarioNegocio.GetSingleUsuarios(filtroUsuario);
            this.grdUsuarios.DataSource = this.DataSourceUsuario;
            this.grdUsuarios.DataBind();
        }

        /// <summary>
        /// Obtiene todos los proyectos.
        /// </summary>
        private void GetProyectos()
        {
            this.ddlProyecto.DataSource = this.proyectoNegocio.GetCatalogProyecto();
            this.ddlProyecto.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlProyecto);
        }

        /// <summary>
        /// Obtiene los perfiles del usuario seleccionado.
        /// </summary>
        private void GetPerfilesByUsuario(bool clean)
        {
            this.DataSourcePerfil = clean ? null : this.usuarioPerfilNegocio.GetPerfilesByUsuario(this.IdUsuario);
            this.grdPerfiles.DataSource = this.DataSourcePerfil;
            this.grdPerfiles.DataBind();
        }

        private void RemovePerfilByUsuario()
        {
            this.usuarioPerfilNegocio.RemovePerfilesByUsuario(this.IdUsuario, this.IdPerfil);
        }

        /// <summary>
        /// Obtiene los filtros y busca los usuarios.
        /// </summary>
        private void Search()
        {
            this.GetFilters();
            this.GetUsuariosByFilters();
        }

        /// <summary>
        /// Método encargado de limpiar.
        /// </summary>
        private void Clean()
        {
            this.IdUsuario = default(int);
            GetPerfilesByUsuario(true);
        }

        /// <summary>
        /// Metódo encargado de limpiar la seleccion del grid;
        /// </summary>
        private void CleanSelection()
        {
            this.grdUsuarios.SelectedIndex = -1;
            this.grdPerfiles.SelectedIndex = -1;
            this.IdPerfil = 0;
        }

        #endregion
    }
}